package edu.nf.project.services.exception;

import edu.nf.project.services.response.ResultVO;
import edu.nf.project.services.exception.derivedAnomalies.*;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常拦截处理器
 */
@RestControllerAdvice(basePackages = "edu.nf.project.webs")
public class GlobalExceptionAdvice {
    /**
     * 拦截全局所有UsersException异常
     * @param e 全局异常
     * @return 视图对象
     * @param <T> 任意类型异常
     */
    @ExceptionHandler(UsersException.class)
    public <T> ResultVO<T> handleGlobalException(GlobalException e) {
        ResultVO<T> resultVO = new ResultVO<>();
        resultVO.setCode(e.getErrorCode());
        resultVO.setMessage(e.getMessage());
        return resultVO;
    }

    /**
     * 拦截全局所有StaffInfoException异常
     * @param e 全局异常
     * @return 视图对象
     * @param <T> 任意类型异常
     */
    @ExceptionHandler(StaffInfoException.class)
    public <T> ResultVO<T> handleGlobalException(StaffInfoException e) {
        ResultVO<T> resultVO = new ResultVO<>();
        resultVO.setCode(e.getErrorCode());
        resultVO.setMessage(e.getMessage());
        return resultVO;
    }

    /**
     * 拦截全局所有CustomerOrderException异常
     * @param e 全局异常
     * @return 视图对象
     * @param <T> 任意类型异常
     */
    @ExceptionHandler(CustomerOrderException.class)
    public <T> ResultVO<T> handleGlobalException(CustomerOrderException e) {
        ResultVO<T> resultVO = new ResultVO<>();
        resultVO.setCode(e.getErrorCode());
        resultVO.setMessage(e.getMessage());
        return resultVO;
    }

    /**
     * 拦截全局所有DishException异常
     * @param e 全局异常
     * @return 视图对象
     * @param <T> 任意类型异常
     */
    @ExceptionHandler(DishException.class)
    public <T> ResultVO<T> handleGlobalException(DishException e) {
        ResultVO<T> resultVO = new ResultVO<>();
        resultVO.setCode(e.getErrorCode());
        resultVO.setMessage(e.getMessage());
        return resultVO;
    }

    /**
     * 拦截全局所有CouponException异常
     * @param e 全局异常
     * @return 视图对象
     * @param <T> 任意类型异常
     */
    @ExceptionHandler(CouponException.class)
    public <T> ResultVO<T> handleGlobalException(CouponException e) {
        ResultVO<T> resultVO = new ResultVO<>();
        resultVO.setCode(e.getErrorCode());
        resultVO.setMessage(e.getMessage());
        return resultVO;
    }

    /**
     * 拦截全局所有MemberException异常
     * @param e 全局异常
     * @return 视图对象
     * @param <T> 任意类型异常
     */
    @ExceptionHandler(MemberException.class)
    public <T> ResultVO<T> handleGlobalException(MemberException e) {
        ResultVO<T> resultVO = new ResultVO<>();
        resultVO.setCode(e.getErrorCode());
        resultVO.setMessage(e.getMessage());
        return resultVO;
    }

    /**
     * 拦截全局所有SelfInspectionException异常
     * @param e 全局异常
     * @return 视图对象
     * @param <T> 任意类型异常
     */
    @ExceptionHandler(SelfInspectionException.class)
    public <T> ResultVO<T> handleGlobalException(SelfInspectionException e) {
        ResultVO<T> resultVO = new ResultVO<>();
        resultVO.setCode(e.getErrorCode());
        resultVO.setMessage(e.getMessage());
        return resultVO;
    }

    /**
     * 拦截全局所有OrderStatisticsException异常
     * @param e 全局异常
     * @return 视图对象
     * @param <T> 任意类型异常
     */
    @ExceptionHandler(OrderStatisticsException.class)
    public <T> ResultVO<T> handleGlobalException(OrderStatisticsException e) {
        ResultVO<T> resultVO = new ResultVO<>();
        resultVO.setCode(e.getErrorCode());
        resultVO.setMessage(e.getMessage());
        return resultVO;
    }

    /**
     * 拦截全局所有MessageException异常
     * @param e 全局异常
     * @return 视图对象
     * @param <T> 任意类型异常
     */
    @ExceptionHandler(MessageException.class)
    public <T> ResultVO<T> handleGlobalException(MessageException e) {
        ResultVO<T> resultVO = new ResultVO<>();
        resultVO.setCode(e.getErrorCode());
        resultVO.setMessage(e.getMessage());
        return resultVO;
    }

    /**
     * 拦截全局所有RolesException异常
     * @param e 全局异常
     * @return 视图对象
     * @param <T> 任意类型异常
     */
    @ExceptionHandler(RolesException.class)
    public <T> ResultVO<T> handleGlobalException(RolesException e) {
        ResultVO<T> resultVO = new ResultVO<>();
        resultVO.setCode(e.getErrorCode());
        resultVO.setMessage(e.getMessage());
        return resultVO;
    }

    /**
     * 拦截所有异常
     * @param e 全局异常
     * @return 视图对象
     * @param <T> 任意类型异常
     */
    /*@ExceptionHandler(Exception.class)
    public <T> ResultVO<T> handleException(Exception e) {
        ResultVO<T> resultVO = new ResultVO<>();
        resultVO.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());
        System.out.println(e);
        resultVO.setMessage("服务器繁忙");
        return resultVO;
    }*/
}
